/******************************************************************************* * Copyright (c) 2010, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ui.internal.handlers; import java.util.Collections; import java.util.Map; import javax.inject.Named; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.HandlerEvent; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandler2; import org.eclipse.core.commands.IHandlerListener; import org.eclipse.core.commands.NotHandledException; import org.eclipse.core.expressions.IEvaluationContext; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.e4.core.commands.ExpressionContext; import org.eclipse.e4.core.commands.internal.HandlerServiceHandler; import org.eclipse.e4.core.commands.internal.HandlerServiceImpl; import org.eclipse.e4.core.commands.internal.SetEnabled; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.internal.workbench.Activator; import org.eclipse.e4.ui.internal.workbench.Policy; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.IElementUpdater; import org.eclipse.ui.internal.Workbench; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.menus.UIElement; /** * @since 3.5 * */ public class E4HandlerProxy implements IHandler2, IHandlerListener, IElementUpdater { public HandlerActivation activation = null; private Command command; private IHandler handler; private boolean logExecute = true; private boolean logSetEnabled = true; public E4HandlerProxy(Command command, IHandler handler) { this.command = command; this.handler = handler; handler.addHandlerListener(this); } @CanExecute public boolean canExecute(IEclipseContext context, @Optional IEvaluationContext staticContext, MApplication application) { if (handler instanceof IHandler2) { Object ctx = staticContext; if (ctx == null) { ctx = new ExpressionContext(application.getContext()); } ((IHandler2) handler).setEnabled(ctx); } return handler.isEnabled(); } @Execute public Object execute(IEclipseContext context, @Optional @Named(HandlerServiceImpl.PARM_MAP) Map parms, @Optional Event trigger, @Optional IEvaluationContext staticContext) throws ExecutionException, NotHandledException { if (Policy.DEBUG_CMDS) { Activator.trace(Policy.DEBUG_CMDS_FLAG, "execute " + command + " and " //$NON-NLS-1$ //$NON-NLS-2$ + handler + " with: " + context, null); //$NON-NLS-1$ } IEvaluationContext appContext = staticContext; if (appContext == null) { appContext = new ExpressionContext(context); } ExecutionEvent event = new ExecutionEvent(command, parms == null ? Collections.EMPTY_MAP : parms, trigger, appContext); if (handler != null && handler.isHandled()) { final Object returnValue = handler.execute(event); return returnValue; } return null; } public IHandler getHandler() { return handler; } @Override public void handlerChanged(HandlerEvent handlerEvent) { IHandler handler = command.getHandler(); if (handler instanceof HandlerServiceHandler) { IEclipseContext appContext = ((Workbench) PlatformUI.getWorkbench()).getApplication() .getContext(); if (HandlerServiceImpl.lookUpHandler(appContext, command.getId()) == this) { ((HandlerServiceHandler) handler).fireHandlerChanged(handlerEvent); } } } @Override public void updateElement(UIElement element, Map parameters) { if (handler instanceof IElementUpdater) { ((IElementUpdater) handler).updateElement(element, parameters); } } @SetEnabled void setEnabled(IEclipseContext context, @Optional IEvaluationContext evalContext) { if (evalContext == null) { evalContext = new ExpressionContext(context); } if (handler instanceof IHandler2) { ((IHandler2) handler).setEnabled(evalContext); } } @Override public void addHandlerListener(IHandlerListener handlerListener) { handler.addHandlerListener(handlerListener); } @Override public void dispose() { handler.dispose(); } @Override public Object execute(ExecutionEvent event) throws ExecutionException { if (logExecute) { logExecute = false; Status status = new Status(IStatus.WARNING, "org.eclipse.ui", //$NON-NLS-1$ "Called handled proxy execute(*) directly" + command, new Exception()); //$NON-NLS-1$ WorkbenchPlugin.log(status); } return null; } @Override public boolean isEnabled() { return handler.isEnabled(); } @Override public boolean isHandled() { return handler.isHandled(); } @Override public void removeHandlerListener(IHandlerListener handlerListener) { handler.removeHandlerListener(handlerListener); } @Override public void setEnabled(Object evaluationContext) { if (logSetEnabled) { logSetEnabled = false; Status status = new Status(IStatus.WARNING, "org.eclipse.ui", //$NON-NLS-1$ "Called handled proxy setEnabled(*) directly" + command, new Exception()); //$NON-NLS-1$ WorkbenchPlugin.log(status); } } }